<?php
/**
 * Essence
 *
 * Класс Essence осуществляет работу с типами сущностей (ID, имя)
 *
 * @author Дмитий Кузьма <kouzma.d@gmail.com>
 * @author Гринько Виталий <perlaws@gmail.com>*
 * @version 2.0
 */
class Essence {

  /*
	protected $tableName = 'essence_type';
	public $pkName = 'ID_essence_type';

  public function __construct($arrInitialFields = null) {
    Service_Debug::setDebug();
		parent::__construct($arrInitialFields);
  }*/

  public function isEssenceTypeCorrect($essenceType) {
  	switch ($essenceType) {
      case 'user':
      case 'section':
      case 'parameter':
      case 'parameter_available':
      case 'parameter_value':
      case 'page':
      case 'template':
      case 'block':
      case 'group':
      case 'template_block':
      case 'template_block_group':
      case 'template_block_group_parameter':
      case 'parameter_gallery':
      case 'parameter_gallery_value':
      	return true;
      default: return false;
  	}
  }
  
  /**
   * Метод получает объект нужного типа. Объект будет сразу наполнен информацией, если передать id. Если этого делать не нужно, передайте null
   *
   * @param string $essenceType - тип сущности
   * @param integer $essenceId - ID сущности или null для создания пустого объекта
   * @return object - объект сущности
   */
  public static function getObjByID($essenceType, $essenceId = null) {
    switch ($essenceType) {
  		case 'user': return new User_User($essenceId);
  		case 'section': return new Section($essenceId);
  		case 'parameter': return new Parameter($essenceId);
  		case 'parameter_available': return new ParameterAvailable($essenceId);
  		case 'item': return new Item($essenceId);
  		case 'parameter_value': {
  			list($itemId, $parameterId) = explode('_', $essenceId);
  			return new ParameterValue($itemId, $parameterId);
  		}
  		case 'page': return new Page($essenceId);
      case 'template': return new Template($essenceId);
      case 'block': return new Block($essenceId);
      case 'group': return new Group($essenceId);
      case 'template_block': {
  			list($templateId, $blockId) = explode('_', $essenceId);
  			return new ParameterValue($itemId, $parameterId);
  		}  		
      case 'template_block_group': {
  			list($templateId, $blockId, $groupId) = explode('_', $essenceId);
  			return new TemplateBlockGroup($templateId, $blockId, $groupId);
  		}
      case 'template_block_group_parameter': {
        list($templateId, $blockId, $groupId, $parameterId) = explode('_', $essenceId);
  			return new TemplateBlockGroupParameter($templateId, $blockId, $groupId, $parameterId);
  		}
  		case 'parameter_gallery': return new ParameterGallery($essenceId);  		
  		case 'parameter_gallery_value': return new ParameterGalleryValue($essenceId);
    }
  }


  /**
   * Проверяет, совпадает ли пользователь с автором
   *
   * @param integer $essenceType
   * @param integer $essenceID
   * @param integer $userId
   */
  public static function isAuthorTheSame($essenceType, $essenceId, $userId = null) {
    if (!$userId) {
      $objSession = User_Session::instance();
      $userId = $objSession->getUserId();
    }
    if (!$userId) return false;
	  $objDB = Service_Database::instance();
		$stmt = "SELECT `ID_user` FROM `" . $essenceType . "`
				WHERE `ID_" . $essenceType . "`='" . $essenceId . "' AND `ID_user`='" . $userId . "'";
    return $objDB->isRecordExist($stmt);  //Осуществляем SQL-запрос
  }

  /**
   * Получает автора материала
   *
   * @param integer $essenceType
   * @param integer $essenceID
   */
  public static function getAuthor($essenceType, $essenceId) {
	  $objDB = Service_Database::instance();
		$stmt = "SELECT `ID_user` FROM `" . $essenceType . "`
				WHERE `ID_" . $essenceType . "`='" . $essenceId . "'";
    return $objDB->selectSimpleField($stmt);  //Осуществляем SQL-запрос
  }

  /**
	 * Инкремент поля для сущности
	 *
	 * @param string $essenceName - Имя сущности
	 * @param int $essenceId - ID сущности
	 * @param string $columnName - поле для инкремента
	 * @return integer
	 */
  public static function incrementColumnInEssecnce($essenceName, $essenceId, $columnName, $count = 1, $pkName = null) {
  	if (!$pkName) $pkName = "ID_" . $essenceName;
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `" . $essenceName . "` SET `" . $essenceName . "`.`" . $columnName . "` = (`" . $essenceName . "`.`" . $columnName . "` + " . $count . ")
		WHERE `" . $essenceName . "`.`" . $pkName . "` = '" . $essenceId . "'";

		$res = $objDB->query($stmt);
		return $res;
	}

	/**
	 * Декремент поля для сущности
	 *
	 * @param string $essenceName - Имя сущности
	 * @param int $essenceId - ID сущности
	 * @param string $columnName - поле для декремента
	 * @return integer
	 */
  public static function decrementColumnInEssecnce($essenceName, $essenceId, $columnName, $count = 1, $pkName = null) {
  	if (!$pkName) $pkName = "ID_" . $essenceName;
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `" . $essenceName . "` SET `" . $essenceName . "`.`" . $columnName . "` = (`" . $essenceName . "`.`" . $columnName . "` - " . $count . ")
		WHERE `" . $essenceName . "`.`" . $pkName . "` = '" . $essenceId . "'";
		return $objDB->query($stmt);
	}

	/**
	 * Пересортировка ++++!
	 * 
	 * @param $table - название таблицы
	 * @param $newSortNum - позиция куда будут переставлены элементы
	 * @param $uniqueField - название уникального ключа
	 * @param $arrEssenceIds - массив ID элементов для переставления в нужном порядке
	 * @param $arrConditions - массив условий выборки, например array('ID_root_item' => 2, 'ID_user' => 1);
	 */
	public static function moveAfterSortLine($table, $newSortNum, $uniqueField, $arrEssenceIds, $arrConditions){
	  Service_Debug::setDebug();
		$objDB = Service_Database::instance();
		$stmtPK = '';
		$stmtConditions = '';
		$i = 0;
		foreach ($arrConditions as $key => $value) {
		  if ($i++) $stmtConditions .= ' AND ';
		  $stmtConditions .= "`" . $table . "`.`" . $key . "` " . ($value === null ? "IS NULL" : "= '" . $value . "'");
		}
		$stmt = "
		SELECT `" . $table . "`.`" . $uniqueField . "`, `" . $table . "`.`sort_num`
		FROM `" . $table . "`
		WHERE " . $stmtConditions . "
		ORDER BY `sort_num`";
		$arrOld = $objDB->select($stmt);
		$arrKeyOld = Service_ArrayConverter::makeKeyArrayFromMultyArray($arrOld, $uniqueField);
		$size = sizeof($arrOld);
		$arrNew = array();
		for ($num = 0; $num < $size; $num++) {
			if (sizeof($arrNew) == $newSortNum)	{
				foreach ($arrEssenceIds as $essenceId) {
		      $arrNew[] = $arrKeyOld[$essenceId];
		      continue;
		    }			  
			}
			if (!in_array($arrOld[$num][$uniqueField], $arrEssenceIds)) $arrNew[] = $arrOld[$num];
		}
		$str = '';
		for ($num = 0; $num < $size; $num++) {
			$str .= " WHEN " . $arrNew[$num][$uniqueField] . " THEN " . $num;
			//$arrSimple[] = $arrNew[$num][$unqueField];
		}
		$stmt = "
		UPDATE `" . $table . "`
		SET `sort_num` = CASE `" . $uniqueField . "` " . $str . " END
		WHERE " . $stmtConditions;
		echo $stmt;
		$objDB->query($stmt);
	}

	/**
	 * Генерация строки вставляемых значений
	 * 
	 * @param $arrMainValues - массив со значениями которые отличаются
	 * @param $arrAdditionals - массив с постоянными значениями значениями ()
	 */
	public static function generateInsertValuesString($arrMainValues, $arrAdditionals) {
    $i = 0;
		$str = '';
		foreach ($arrMainValues as $mainValue) {
  		if ($i++) $str .= ',';
			$str .= "(" . $mainValue;
      foreach ($arrAdditionals as $addValue) {
        $str .= "," . $addValue;
      }
			$str .= ")";
		}	
		return $str;
	}
	
}
?>